/*
 * nipc.c
 *
 *  Created on: 20/10/2011
 *      Author: Normandia
 */

#include "nipc.h"

void eliminarMensaje(T_MENSAJE* mensaje) {

	if (mensaje->length > 0)
		free(mensaje->mensaje);

	free(mensaje);

}

T_MENSAJE* generarMensaje(uint8_t tipo, uint16_t length, void* mensaje){

	T_MENSAJE* msg_generado;

	msg_generado = malloc(sizeof(T_MENSAJE));
	msg_generado->tipo = tipo;
	msg_generado->length = length;

	if(length > 0) {
		/*msg_generado->mensaje = malloc(length);

		memcpy(msg_generado->mensaje, mensaje,length);*/
		msg_generado->mensaje = mensaje;
	}else
		msg_generado->mensaje = NULL;

	return msg_generado;

}

T_MENSAJE* decodificarMensaje(void* mensaje){

	T_MENSAJE* msg_generado;

	msg_generado = malloc(sizeof(T_MENSAJE));
	memcpy(msg_generado, mensaje, 3);
	if(msg_generado->length > 0) {
		msg_generado->mensaje = malloc(msg_generado->length);
		memcpy(msg_generado->mensaje, mensaje+3,msg_generado->length);
	}else
		msg_generado->mensaje = NULL;

	return msg_generado;

}

T_MENSAJE* mensaje_lectura(uint32_t sector, uint64_t id_pedido){//liberar mensaje??

	T_MSG_LECTURA* msg = malloc(sizeof(T_MSG_LECTURA));
	msg->id_pedido = id_pedido;
	msg->sector = sector;

	return generarMensaje(TIPO_READSECTOR,sizeof(T_MSG_LECTURA), msg);

}

T_MENSAJE* mensaje_lectura_rta(uint64_t id_pedido, void* sector_buffer) {

	T_MSG_LECTURA_RTA* msg = malloc(sizeof(T_MSG_LECTURA_RTA));
	msg->id_pedido = id_pedido;
	memcpy(msg->data,sector_buffer,512);

	return generarMensaje(TIPO_READSECTOR,sizeof(T_MSG_LECTURA_RTA),msg);

}

T_MENSAJE* mensaje_escritura(uint32_t sector, uint64_t id_pedido, void* sector_buffer){

	T_MSG_ESCRITURA* msg = malloc(sizeof(T_MSG_ESCRITURA));
	msg->sector = sector;
	msg->id_pedido = id_pedido;
	memcpy(msg->data,sector_buffer,512);

	return generarMensaje(TIPO_WRITESECTOR,sizeof(T_MSG_ESCRITURA),msg);

}

T_MENSAJE* mensaje_RaidCopy(uint32_t sector, uint64_t id_pedido, void* sector_buffer){

	T_MSG_ESCRITURA* msg = malloc(sizeof(T_MSG_ESCRITURA));
	msg->sector = sector;
	msg->id_pedido = id_pedido;
	memcpy(msg->data,sector_buffer,512);

	return generarMensaje(TIPO_RAID_COPY,sizeof(T_MSG_ESCRITURA),msg);

}

T_MENSAJE* mensaje_escritura_rta(uint64_t id_pedido) {

	T_MSG_ESCRITURA_RTA* msg = malloc(sizeof(T_MSG_ESCRITURA_RTA));
	msg->id_pedido = id_pedido;
	return generarMensaje(TIPO_WRITESECTOR,sizeof(T_MSG_ESCRITURA_RTA),msg);

}
